package com.tedu.api.ee;

import org.junit.Test;

import java.io.*;
import java.util.ArrayList;
import java.util.List;

/**
 * 流---传输数据---传输数据过程绝对不能出错【处理手段】
 * 标准流结合异常---标准IO
 *
 * 异常
 * Java面向对象语言，程序中所出现的所有错误，定义为对象【处理应对错误】
 *
 * Throwable顶级异常超类
 *
 * Exception异常:描述程序级别的错误---有解决方案
 *              编译期：RunTimeException异常表示类
 *                    FileOutputStream创建对象---波浪线---抛出方法之外
 *              检查异常：通常都是编译器检查处理，程序直接报错，抛出
 *              解决方案：①捕获异常（*）
 *                      ②抛出异常---抛出方法之外--打印控制台
 *              运行期：控制台直接显示异常对象【异常对象名字，产生原因】
 *              非检查异常：控制台输出异常对象名称RunTimeException异常表示
 *              【throw与throws---RunTimeException】
 *
 * Error错误：描述程序级别的错误---出现---程序宕机
 *           非常低--->递归问题--->
 */
public class EE {
    /**
     * Error  错误---程序严重错误
     * 模拟：方法调方法---栈溢出错误
     * StackOverflowError栈溢出错误
     * ----
     * while(true){
     *     拼接字符串对象
     * }
     */
    public static void method(){
        method();
    }
    @Test
    public void testError(){  EE.method();}
    /**
     * Exception 异常：检查异常【出现编译期】---代码报波浪线
     *                两种处理手段：①捕获异常
     *                           语法：try{
     *                               怀疑代码可能有异常或者提示音异常
     *                           }catch(小异常名字：e){
     *                               e.printStacktrace();打印信息异常
     *                           }catch(中异常名字：e){
     *                               e.printStacktrace();打印信息异常
     *                           }catch(大异常名字：e){
     *                                e.printStacktrace();打印信息异常
     *                           }finally{
     *                               一定执行代码块
     *                           }
     *
     *                            ②抛出异常  throws  异常名字【并未解决】
     *                考试题：异常关键字：throw
     *                非检查异常【出现运行期】---代码无错误---控制台
     *-----------------------------
     * 异常：FileNotFoundException  文件不存在异常
     * 产生原因：路径写错、文件名写错
     * 异常：NullPointerException     空指针异常
     * 产生原因：获取字符串为空，数组：值为空，集合：元素为空【存在null值】
     *异常：StringIndexOutOfBoundsException    字符串下标越界
     * 产生原因：字符串下标没有对应字符
     * 异常：NumberFormatException   数字转换异常
     * 产生原因：字符串不是正确的类型
     */
    @Test
    public void testException() throws FileNotFoundException {
        //检查异常【出现编译器】---代码报波浪线
        //FileOutputStream fis=new FileOutputStream("");
        //非检查异常【出现运行期】---控制台
    try {
       String str = "a";
       str.length();
       str.charAt(1);
       Integer.parseInt(str);//解析字符串---转换为对应类型
       }catch(StringIndexOutOfBoundsException e) {
        e.printStackTrace();  //打印异常对象信息
        System.out.println("字符串小异常,下标越界异常~~");
       } catch (NumberFormatException e){
        e.printStackTrace();  //打印异常信息
        System.out.println("字符串小异常~~");
       }catch (Exception e){
        e.printStackTrace();
        System.out.println("大异常");
    }
    finally {
        System.out.println("一定执行代码块~");
    }
    }
    /**
     * 作业1：写出5个【非检查异常的代码示例】
     * 提示：查API---java.lang.异常
     *       字符串、包装类、集合、IO流
     */
    @Test
    public void testHomeWork1() {
        //1.字符串操作中的异常
        class StringExceptionExample {
            public void main(String[] args) {
                String str = null;
                // NullPointerException 是 RuntimeException 的子类
                System.out.println(str.length());
            }
        }
        //2.包装类中的异常
        class WrapperExceptionExample {
            public void main(String[] args) {
                String str = "123a";
                try {
                    // NumberFormatException 是 RuntimeException 的子类
                    int number = Integer.parseInt(str);
                } catch (NumberFormatException e) {
                    System.out.println("无法将字符串转换为整数: " + e.getMessage());
                }
            }
        }
        //3.集合中的异常
        class CollectionExceptionExample {
            public void main(String[] args) {
                List<String> list = new ArrayList<>();
                list.add("element1");
                // IndexOutOfBoundsException 是 RuntimeException 的子类
                System.out.println(list.get(1));
            }
        }
        //4.IO流中的异常


        class IOExceptionExample {
            public void main(String[] args) {
                String filePath = "non_existent_file.txt";
                try (BufferedReader br = new BufferedReader(new FileReader(filePath))) {
                    // 这里假设文件不存在，FileReader 会抛出 FileNotFoundException，但我们不捕获它
                    // 而是通过自定义 RuntimeException 包装它
                    String line;
                    while ((line = br.readLine()) != null) {
                        System.out.println(line);
                    }
                } catch (IOException e) {
                    throw new RuntimeException("IO 操作失败: " + e.getMessage());
                }
            }
        }
        //5.自定义非检查异常示例
        class CustomUncheckedExceptionExample {
            public void main(String[] args) {
                try {
                    // 自定义 RuntimeException
                    throw new MyCustomUncheckedException("这是一个自定义的非检查异常");
                } catch (MyCustomUncheckedException e) {
                    System.out.println("捕获到自定义异常: " + e.getMessage());
                }
            }

            // 自定义的非检查异常类
            class MyCustomUncheckedException extends RuntimeException {
                public MyCustomUncheckedException(String message) {
                    super(message);
                }
            }
        }
    }
    }






